接下來我們要開始學習如何取得某一週的帳務。在全端的開發過程中,比較順的方式是從後端一路開發到前端,而後端的開發又是從對於資料庫操作開始,然後是服務層,最後是控制層,一層一層的開發過來。
在經歷前面20天的練習,我相信大家已經開始熟練了這個流程,接下來就是更進階一點的教大家一些變化的技巧。
今天的目標是開發從資料庫中取得一週區間的教學,就讓我們開始吧!
這個需求跟其他的不一樣的地方在於,我們需要取得某個時段的資料,因為Repository並沒有預設的方法,所以我們必須要新增一個指令,取得某個區段下的資料。
整個程式碼如下
package net.Eric.accounting.repository;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import net.Eric.accounting.entity.Account;
public interface AccountRepository extends JpaRepository<Account, Long>{
List<Account> findByCategory(String category);
List<Account> findAllByCreateDateBetween(LocalDateTime startDate, LocalDateTime endDate);
}
這裡的Service層的需求就跟Repository不太相同,因為我們要取得的是週數,所以我們進來的資料是年與週,我們得到年份與週數之後,再藉由程式去取得實際的開始與結束時間,然後去取得資料。
所以Service層我們要開發這個功能
List<AccountDto> getAccountsByWeek(int year, int week);
接下來回到ServiceImpl,我們要開始新增開始與結束日期,首先,我們要先取得週數的資訊,我們可以使用weekFields這個類別來宣告週數
WeekFields 是 Java 中 java.time.temporal 套件的一部分,用於定義與週(星期)相關的字段。它允許你指定特定的星期制(例如週的起始日是星期幾,還有一年的第一週如何計算)來進行時間的運算。這對於不同地區有不同的星期計算規則非常有用。
接下來,我們就要設置開始與結束的時間
這段程式碼的目的是根據特定的年份和週數,找出該週的起始日期(週一)和結束日期(週日),然後將這一週的起始和結束時間轉換為具體的時間範圍(從週一的00:00到週日的23:59:59)。
@Override
public List<AccountDto> getAccountsByWeek(int year, int week) {
// 計算該週的起始日期和結束日期
WeekFields weekFields = WeekFields.of(Locale.getDefault());
LocalDate startDate = LocalDate.now()
.withYear(year)
.with(weekFields.weekOfYear(), week)
.with(weekFields.dayOfWeek(), 1); // 週一
LocalDate endDate = startDate.plusDays(6); // 週日
LocalDateTime startDateTime = startDate.atStartOfDay();
LocalDateTime endDateTime = endDate.atTime(23, 59, 59);
// 查詢符合條件的帳戶資料
List<Account> accounts = accountRepository.findAllByCreateDateBetween(startDateTime, endDateTime);
// 將 Entity 轉換為 DTO
return accounts.stream().map(account -> new AccountDto(
account.getId(),
account.getName(),
account.getExpensed(),
account.getCategory(),
account.getAmount(),
account.getCreateDate()
)).collect(Collectors.toList());
}
最終,我們在Controller層中要設置這個API,藉由提供year跟week的資料去取得相關結果
@GetMapping("/weekly/{year}/{week}")
public List<AccountDto> getAccountsByWeek(@PathVariable("year") int year, @PathVariable("week") int week) {
return accountsService.getAccountsByWeek(year, week);
}
最後,我們可以在Postman測試,只要能夠正常回傳,就OK囉!